import { existsSync, writeFileSync } from 'fs';
import { resolve } from 'path';

const redirects = {
  '/modules/_messageformat_fluent.html': [
    'fluent.defaultfunctionmap.md',
    'fluent.fluentmessageref.md',
    'fluent.fluentmessageresource.md',
    'fluent.fluentmessageresourcedata.md',
    'fluent.fluenttomessage.md',
    'fluent.fluenttomessageoptions.md',
    'fluent.fluenttoresource.md',
    'fluent.fluenttoresourcedata.md',
    'fluent.getfluentfunctions.md',
    'fluent.md',
    'fluent.messagetofluent.md',
    'fluent.resourcetofluent.md'
  ],
  '/modules/_messageformat_icu-messageformat-1.html': [
    'icu-messageformat-1.getmf1functions.md',
    'icu-messageformat-1.md',
    'icu-messageformat-1.mf1options.md',
    'icu-messageformat-1.mf1tomessage.md',
    'icu-messageformat-1.mf1tomessagedata.md'
  ],
  '/modules/messageformat_cst.html': [
    'messageformat.cst.attribute.end.md',
    'messageformat.cst.attribute.equals.md',
    'messageformat.cst.attribute.md',
    'messageformat.cst.attribute.name.md',
    'messageformat.cst.attribute.open.md',
    'messageformat.cst.attribute.start.md',
    'messageformat.cst.attribute.value.md',
    'messageformat.cst.catchallkey.end.md',
    'messageformat.cst.catchallkey.md',
    'messageformat.cst.catchallkey.start.md',
    'messageformat.cst.catchallkey.type.md',
    'messageformat.cst.complexmessage.declarations.md',
    'messageformat.cst.complexmessage.errors.md',
    'messageformat.cst.complexmessage.md',
    'messageformat.cst.complexmessage.pattern.md',
    'messageformat.cst.complexmessage.type.md',
    'messageformat.cst.declaration.md',
    'messageformat.cst.expression.annotation.md',
    'messageformat.cst.expression.arg.md',
    'messageformat.cst.expression.attributes.md',
    'messageformat.cst.expression.braces.md',
    'messageformat.cst.expression.end.md',
    'messageformat.cst.expression.markup.md',
    'messageformat.cst.expression.md',
    'messageformat.cst.expression.start.md',
    'messageformat.cst.expression.type.md',
    'messageformat.cst.functionref.end.md',
    'messageformat.cst.functionref.md',
    'messageformat.cst.functionref.name.md',
    'messageformat.cst.functionref.open.md',
    'messageformat.cst.functionref.options.md',
    'messageformat.cst.functionref.start.md',
    'messageformat.cst.functionref.type.md',
    'messageformat.cst.identifier.md',
    'messageformat.cst.inputdeclaration.end.md',
    'messageformat.cst.inputdeclaration.keyword.md',
    'messageformat.cst.inputdeclaration.md',
    'messageformat.cst.inputdeclaration.start.md',
    'messageformat.cst.inputdeclaration.type.md',
    'messageformat.cst.inputdeclaration.value.md',
    'messageformat.cst.junk.end.md',
    'messageformat.cst.junk.md',
    'messageformat.cst.junk.name.md',
    'messageformat.cst.junk.source.md',
    'messageformat.cst.junk.start.md',
    'messageformat.cst.junk.type.md',
    'messageformat.cst.literal.close.md',
    'messageformat.cst.literal.end.md',
    'messageformat.cst.literal.md',
    'messageformat.cst.literal.open.md',
    'messageformat.cst.literal.quoted.md',
    'messageformat.cst.literal.start.md',
    'messageformat.cst.literal.type.md',
    'messageformat.cst.literal.value.md',
    'messageformat.cst.localdeclaration.end.md',
    'messageformat.cst.localdeclaration.equals.md',
    'messageformat.cst.localdeclaration.keyword.md',
    'messageformat.cst.localdeclaration.md',
    'messageformat.cst.localdeclaration.start.md',
    'messageformat.cst.localdeclaration.target.md',
    'messageformat.cst.localdeclaration.type.md',
    'messageformat.cst.localdeclaration.value.md',
    'messageformat.cst.markup.close.md',
    'messageformat.cst.markup.end.md',
    'messageformat.cst.markup.md',
    'messageformat.cst.markup.name.md',
    'messageformat.cst.markup.open.md',
    'messageformat.cst.markup.options.md',
    'messageformat.cst.markup.start.md',
    'messageformat.cst.markup.type.md',
    'messageformat.cst.md',
    'messageformat.cst.message.md',
    'messageformat.cst.option.end.md',
    'messageformat.cst.option.equals.md',
    'messageformat.cst.option.md',
    'messageformat.cst.option.name.md',
    'messageformat.cst.option.start.md',
    'messageformat.cst.option.value.md',
    'messageformat.cst.pattern.body.md',
    'messageformat.cst.pattern.braces.md',
    'messageformat.cst.pattern.end.md',
    'messageformat.cst.pattern.md',
    'messageformat.cst.pattern.start.md',
    'messageformat.cst.reservedannotation.end.md',
    'messageformat.cst.reservedannotation.md',
    'messageformat.cst.reservedannotation.open.md',
    'messageformat.cst.reservedannotation.source.md',
    'messageformat.cst.reservedannotation.start.md',
    'messageformat.cst.reservedannotation.type.md',
    'messageformat.cst.reservedstatement.body.md',
    'messageformat.cst.reservedstatement.end.md',
    'messageformat.cst.reservedstatement.keyword.md',
    'messageformat.cst.reservedstatement.md',
    'messageformat.cst.reservedstatement.start.md',
    'messageformat.cst.reservedstatement.type.md',
    'messageformat.cst.reservedstatement.values.md',
    'messageformat.cst.selectmessage.declarations.md',
    'messageformat.cst.selectmessage.errors.md',
    'messageformat.cst.selectmessage.match.md',
    'messageformat.cst.selectmessage.md',
    'messageformat.cst.selectmessage.selectors.md',
    'messageformat.cst.selectmessage.type.md',
    'messageformat.cst.selectmessage.variants.md',
    'messageformat.cst.simplemessage.declarations.md',
    'messageformat.cst.simplemessage.errors.md',
    'messageformat.cst.simplemessage.md',
    'messageformat.cst.simplemessage.pattern.md',
    'messageformat.cst.simplemessage.type.md',
    'messageformat.cst.syntax.end.md',
    'messageformat.cst.syntax.md',
    'messageformat.cst.syntax.start.md',
    'messageformat.cst.syntax.value.md',
    'messageformat.cst.text.end.md',
    'messageformat.cst.text.md',
    'messageformat.cst.text.start.md',
    'messageformat.cst.text.type.md',
    'messageformat.cst.text.value.md',
    'messageformat.cst.variableref.end.md',
    'messageformat.cst.variableref.md',
    'messageformat.cst.variableref.name.md',
    'messageformat.cst.variableref.open.md',
    'messageformat.cst.variableref.start.md',
    'messageformat.cst.variableref.type.md',
    'messageformat.cst.variant.end.md',
    'messageformat.cst.variant.keys.md',
    'messageformat.cst.variant.md',
    'messageformat.cst.variant.start.md',
    'messageformat.cst.variant.value.md',
    'messageformat.attribute._cst_.md',
    'messageformat.catchallkey._cst_.md',
    'messageformat.functionannotation._cst_.md',
    'messageformat.inputdeclaration._cst_.md',
    'messageformat.literal._cst_.md',
    'messageformat.localdeclaration._cst_.md',
    'messageformat.markup._cst_.md',
    'messageformat.option._cst_.md',
    'messageformat.patternmessage._cst_.md',
    'messageformat.selectmessage._cst_.md',
    'messageformat.unsupportedannotation._cst_.md',
    'messageformat.unsupportedstatement._cst_.md',
    'messageformat.variableref._cst_.md',
    'messageformat.variant._cst_.md'
  ],
  '/modules/messageformat.html': [
    'messageformat.attribute.md',
    'messageformat.attribute.name.md',
    'messageformat.attribute.type.md',
    'messageformat.attribute.value.md',
    'messageformat.catchallkey.md',
    'messageformat.catchallkey.type.md',
    'messageformat.catchallkey.value.md',
    'messageformat.declaration.md',
    'messageformat.expression.md',
    'messageformat.functionannotation.md',
    'messageformat.functionannotation.name.md',
    'messageformat.functionannotation.options.md',
    'messageformat.functionannotation.type.md',
    'messageformat.inputdeclaration.md',
    'messageformat.inputdeclaration.name.md',
    'messageformat.inputdeclaration.type.md',
    'messageformat.inputdeclaration.value.md',
    'messageformat.iscatchallkey.md',
    'messageformat.isexpression.md',
    'messageformat.isfunctionannotation.md',
    'messageformat.isliteral.md',
    'messageformat.ismarkup.md',
    'messageformat.ismessage.md',
    'messageformat.ispatternmessage.md',
    'messageformat.isselectmessage.md',
    'messageformat.isunsupportedannotation.md',
    'messageformat.isvariableref.md',
    'messageformat.literal.md',
    'messageformat.literal.type.md',
    'messageformat.literal.value.md',
    'messageformat.localdeclaration.md',
    'messageformat.localdeclaration.name.md',
    'messageformat.localdeclaration.type.md',
    'messageformat.localdeclaration.value.md',
    'messageformat.markup.attributes.md',
    'messageformat.markup.kind.md',
    'messageformat.markup.md',
    'messageformat.markup.name.md',
    'messageformat.markup.options.md',
    'messageformat.markup.type.md',
    'messageformat.md',
    'messageformat.message.md',
    'messageformat.messagedatamodelerror._constructor_.md',
    'messageformat.messagedatamodelerror.md',
    'messageformat.messagedatamodelerror.type.md',
    'messageformat.messagedatetimepart.locale.md',
    'messageformat.messagedatetimepart.md',
    'messageformat.messagedatetimepart.parts.md',
    'messageformat.messagedatetimepart.source.md',
    'messageformat.messagedatetimepart.type.md',
    'messageformat.messageerror._constructor_.md',
    'messageformat.messageerror.md',
    'messageformat.messageerror.type.md',
    'messageformat.messageexpressionpart.locale.md',
    'messageformat.messageexpressionpart.md',
    'messageformat.messageexpressionpart.parts.md',
    'messageformat.messageexpressionpart.source.md',
    'messageformat.messageexpressionpart.type.md',
    'messageformat.messageexpressionpart.value.md',
    'messageformat.messagefallbackpart.md',
    'messageformat.messagefallbackpart.source.md',
    'messageformat.messagefallbackpart.type.md',
    'messageformat.messageformat._constructor_.md',
    'messageformat.messageformat.format.md',
    'messageformat.messageformat.formattoparts.md',
    'messageformat.messageformat.md',
    'messageformat.messageformat.resolvedoptions.md',
    'messageformat.messageformatoptions.functions.md',
    'messageformat.messageformatoptions.localematcher.md',
    'messageformat.messageformatoptions.md',
    'messageformat.messagefromcst.md',
    'messageformat.messagefunctions.md',
    'messageformat.messageliteralpart.md',
    'messageformat.messageliteralpart.type.md',
    'messageformat.messageliteralpart.value.md',
    'messageformat.messagemarkuppart.kind.md',
    'messageformat.messagemarkuppart.md',
    'messageformat.messagemarkuppart.name.md',
    'messageformat.messagemarkuppart.options.md',
    'messageformat.messagemarkuppart.source.md',
    'messageformat.messagemarkuppart.type.md',
    'messageformat.messagenode.md',
    'messageformat.messagenumberpart.locale.md',
    'messageformat.messagenumberpart.md',
    'messageformat.messagenumberpart.parts.md',
    'messageformat.messagenumberpart.source.md',
    'messageformat.messagenumberpart.type.md',
    'messageformat.messageparseroptions.md',
    'messageformat.messagepart.md',
    'messageformat.messageresolutionerror._constructor_.md',
    'messageformat.messageresolutionerror.md',
    'messageformat.messageresolutionerror.source.md',
    'messageformat.messageresolutionerror.type.md',
    'messageformat.messageselectionerror._constructor_.md',
    'messageformat.messageselectionerror.md',
    'messageformat.messageselectionerror.type.md',
    'messageformat.messagestringpart.locale.md',
    'messageformat.messagestringpart.md',
    'messageformat.messagestringpart.source.md',
    'messageformat.messagestringpart.type.md',
    'messageformat.messagestringpart.value.md',
    'messageformat.messagesyntaxerror._constructor_.md',
    'messageformat.messagesyntaxerror.end.md',
    'messageformat.messagesyntaxerror.md',
    'messageformat.messagesyntaxerror.start.md',
    'messageformat.messagesyntaxerror.type.md',
    'messageformat.messageunknownpart.md',
    'messageformat.messageunknownpart.source.md',
    'messageformat.messageunknownpart.type.md',
    'messageformat.messageunknownpart.value.md',
    'messageformat.option.md',
    'messageformat.option.name.md',
    'messageformat.option.type.md',
    'messageformat.option.value.md',
    'messageformat.parsecst.md',
    'messageformat.parsemessage.md',
    'messageformat.pattern.md',
    'messageformat.patternmessage.comment.md',
    'messageformat.patternmessage.declarations.md',
    'messageformat.patternmessage.md',
    'messageformat.patternmessage.pattern.md',
    'messageformat.patternmessage.type.md',
    'messageformat.selectmessage.comment.md',
    'messageformat.selectmessage.declarations.md',
    'messageformat.selectmessage.md',
    'messageformat.selectmessage.selectors.md',
    'messageformat.selectmessage.type.md',
    'messageformat.selectmessage.variants.md',
    'messageformat.stringifycst.md',
    'messageformat.stringifymessage.md',
    'messageformat.unsupportedannotation.md',
    'messageformat.unsupportedannotation.name.md',
    'messageformat.unsupportedannotation.options.md',
    'messageformat.unsupportedannotation.source.md',
    'messageformat.unsupportedannotation.type.md',
    'messageformat.unsupportedstatement.body.md',
    'messageformat.unsupportedstatement.expressions.md',
    'messageformat.unsupportedstatement.keyword.md',
    'messageformat.unsupportedstatement.md',
    'messageformat.unsupportedstatement.name.md',
    'messageformat.unsupportedstatement.type.md',
    'messageformat.unsupportedstatement.value.md',
    'messageformat.validate.md',
    'messageformat.variableref.md',
    'messageformat.variableref.name.md',
    'messageformat.variableref.type.md',
    'messageformat.variant.keys.md',
    'messageformat.variant.md',
    'messageformat.variant.type.md',
    'messageformat.variant.value.md',
    'messageformat.visit.md'
  ]
};

function main(apiDocsDir) {
  if (!apiDocsDir) throw new Error('Expected docs dir as CLI arg');

  for (const [target, files] of Object.entries(redirects)) {
    const body = `---\nlayout: redirect\ntarget: ${target}\n---\n`;
    for (const fn of files) {
      const filepath = resolve(apiDocsDir, fn);
      if (existsSync(filepath)) {
        throw new Error(`Expected not to exist: ${filepath}`);
      }
      writeFileSync(filepath, body);
    }
  }
}

main(process.argv[2]);
